package com.fbw.sys.controller;

/*
菜单管理的控制器
 */

import com.fbw.sys.constast.SysConstast;
import com.fbw.sys.domain.Menu;
import com.fbw.sys.domain.User;
import com.fbw.sys.service.MenuService;
import com.fbw.sys.uitls.*;
import com.fbw.sys.vo.MenuVo;
import com.sun.org.apache.xpath.internal.operations.Bool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

//RestController 就是让所有返回json格式,少写一个@RequestBoody
@RestController
@RequestMapping("menu")
public class MenuController {

    @Autowired
    private MenuService menuService;

    @RequestMapping("loadIndexLeftMenuJson")
    public List<TreeNode> loadInfexLeftMenuJson(MenuVo menuVo){
        User user = (User) WebUtils.getHttpSession().getAttribute("user");
        List<Menu> list = null;
        menuVo.setAvailable(SysConstast.AVAILABLE_TRUE);//用传入的menu值控制查询内容。
        if(user.getType() == SysConstast.USER_TYPE_SUPER){
            //1为超级管理员,将硬编码的1个替换成常量值
            list=this.menuService.queryAllMenuForList(menuVo);
        }else{
            //加不加this都行，根据他的习惯还是加上
            list=this.menuService.queryMenuByUserIdForList(menuVo,user.getUserid());
        }
        return TreeNodeBuilde.Builder(list);
    }

    /**
     * 加载菜单管理左边的菜单树
     */
    @RequestMapping("loadMenuManagerLeftTreeJson")
    public DataGridView loadMenuManagerLeftTreeJson(MenuVo menuVo){
        menuVo.setAvailable(SysConstast.AVAILABLE_TRUE);//只查询可用的
        List<Menu> list=this.menuService.queryAllMenuForList(menuVo);
        List<TreeNode> nodes= new ArrayList<>();
        //把list里面的数据放到nodes
        for (Menu menu : list) {
            int id=menu.getId();
            int pid=menu.getPid();
            String title=menu.getTitle();
            String icon=menu.getIcon();
            String href=menu.getHref();
            Boolean spread=menu.getSpread()==SysConstast.SPREAD_TRUE?true:false;
            String target=menu.getTarget();
            nodes.add(new TreeNode(id, pid, title, icon, href, spread, target));
        }
        return new DataGridView(nodes);
    }

    /**
     * 加载菜单列表返回DataGridView
     */
    @RequestMapping("loadAllMenu")
    public DataGridView loadAllMenu(MenuVo menuVo) {
        return this.menuService.queryAllMenu(menuVo);
    }

    /**
     * 添加菜单
     */
    @RequestMapping("addMenu")
    public ResultObj addMenu(MenuVo menuVo){
//我怀疑传入的是字符串，而封装的是int，报错
/*
添加BUG解决：
报错原因springmvc封装报错，一开始以为mvc封装不能进行类型转换，测试过后发现我天真了。前端传入的键值对是以Map<String,String[]>封装的
都是String类型怎么可能不会封装，如何我继续排查，原来是前端传入id值为空，这样导致类型转换报错报400，之后找到赋值为0，BUG解决。
总结：字符串转换那些最好别直接靠mvc转换，鬼知道前端会传什么东西来，要不就是在后端加一层过滤，比如空就赋值为0，其它不符合规定的字符串就
不执行转换。
 */
        try {
            this.menuService.addMenu(menuVo);
            return ResultObj.ADD_SUCCESS;
        }catch (Exception e){
            e.printStackTrace();
            return ResultObj.ADD_ERROR;
        }
    }

    /**
     * 添加菜单
     */
    @RequestMapping("updateMenu")
    public ResultObj updateMenu(MenuVo menuVo){
        try {
            this.menuService.updateMenu(menuVo);
            return ResultObj.UPDATE_SUCCESS;
        }catch (Exception e){
            e.printStackTrace();
            return ResultObj.UPDATE_ERROR;
        }
    }

    /**
     * 根据id判断当前菜单有没有子节点
     * 有返回code>=0
     * 没有 返回code<0
     */
    @RequestMapping("checkMenuHasChildren")
    public ResultObj checkMenuHasChildren(MenuVo menuVo){
        //根据pid查询菜单数量
        Integer count=this.menuService.queryMenuByPid(menuVo.getId());
        if(count>0) {
            return ResultObj.STATUS_TRUE;
        }else {
            return ResultObj.STATUS_FALSE;
        }
    }

    /**
     * 删除菜单
     */
    @RequestMapping("deleteMenu")
    public ResultObj deleteMenu(MenuVo menuVo) {
        try {
            this.menuService.deleteMenu(menuVo);
            return ResultObj.DELETE_SUCCESS;
        } catch (Exception e) {
            e.printStackTrace();
            return ResultObj.DELETE_ERROR;
        }
    }

}
